package cn.yh.shop.product.service.impl;

import java.io.IOException;
import java.util.List;
import java.util.Set;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.springframework.stereotype.Service;
import cn.yh.shop.product.model.Cart;
import cn.yh.shop.product.model.CartItem;
import cn.yh.shop.product.service.ICartService;
import cn.yh.shop.util.RedisUtils;
import redis.clients.jedis.Jedis;
@Service
public class CartServiceImpl implements ICartService {
	
	/**
	 * @Description: cart : 购物车bean
	 */
	private Cart carts ; 
	/**
	 * @Description: item : 购物车商品项bean
	 */
	private CartItem item;
	/**
	 * @Description: jedis : jedis对象用来操作jedis
	 */
	private Jedis jedis;
	/**
	 * @Description: mapper : ObjectMapper工具类实现json字符串与object对象直接的转化
	 */
	private ObjectMapper mapper = new ObjectMapper();
	
	public Cart getCarts() {
		return carts;
	}

	public void setCarts(Cart carts) {
		this.carts = carts;
	}

	@Override
	public Cart getCart(Integer userid) {
		carts= new Cart(); //new一个cart对象
		carts.setUserid(userid);
		jedis = RedisUtils.getPool().getResource();//从jedis池中得到jdeis对象
		String id = "" + userid;
		if(jedis.exists(id)){ //存在的话直接查询
			try {
				Set<String> smembers = jedis.smembers(id);
				for (String string : smembers) {
					item = mapper.readValue(jedis.get(string),CartItem.class);
					carts.addItem(item);
				}
			} catch (JsonParseException e) {
				e.printStackTrace();
			} catch (JsonMappingException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return carts;
	}

	@Override
	public Cart updateCart(Integer userid, CartItem cartItem) {
		try {
			jedis = RedisUtils.getPool().getResource();//从jedis池中得到jdeis对象
			String id = "" + userid;
			mapper.enable(SerializationConfig.Feature.AUTO_DETECT_GETTERS);// 没出现多余的空行
			String itemid = "" + userid + ":" + cartItem.getGoodsId()+ ":" + cartItem.getTasteId()+ ":" + cartItem.getPakageId();
			jedis.set(itemid, mapper.writeValueAsString(cartItem)); // 插入item到redis中
			jedis.sadd(id, itemid);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return getCart(userid);
	}

	@Override
	public Cart delCart(Integer userid,CartItem cartItem) {  //jedis不支持删除指定的value,因此,只能全部覆盖重新
		jedis = RedisUtils.getPool().getResource();//从jedis池中得到jdeis对象
		String id = "" + userid;
		//List<CartItem> items = cart.getItems();
		String itemid = "" + userid + ":" + cartItem.getGoodsId()+ ":" + cartItem.getTasteId()+ ":" + cartItem.getPakageId();
		jedis.srem(id, itemid);  //先删除购物车set集合
		jedis.del(itemid);       //再删除该商品项
		return getCart(userid);
	}

	@Override
	public int addCart(Integer userid, CartItem cartItem) {
		int  i = 0; //返回添加的状态 0:表示不成功,1表示成功
		try {
			jedis = RedisUtils.getPool().getResource();//从jedis池中得到jdeis对象
			String id = "" + userid;
			mapper.enable(SerializationConfig.Feature.AUTO_DETECT_GETTERS);// 没出现多余的空行
			String itemid = "" + userid + ":" + cartItem.getGoodsId()+ ":" + cartItem.getTasteId()+ ":" + cartItem.getPakageId();
			System.out.println("itemid:"+itemid);
			if(jedis.get(itemid) != null){  //如果存在此商品项目
				item = mapper.readValue(jedis.get(itemid),CartItem.class);
				cartItem.setCount(item.getCount()+cartItem.getCount());  //只有三样同时满足,才是一样商品
			}
			jedis.set(itemid, mapper.writeValueAsString(cartItem)); // 插入item到redis中
			jedis.sadd(id, itemid);
			i = 1; //如果执行到这一部,说明添加成功,返回状态1
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return i;
	}

	@Override
	public CartItem getCartItem(Integer userid, CartItem cartItem) {
		jedis = RedisUtils.getPool().getResource();//从jedis池中得到jdeis对象
		String itemid = "" + userid + ":" + cartItem.getGoodsId()+ ":" + cartItem.getTasteId()+ ":" + cartItem.getPakageId();
		mapper.enable(SerializationConfig.Feature.AUTO_DETECT_GETTERS);// 没出现多余的空行
		try {
			item = mapper.readValue(jedis.get(itemid),CartItem.class);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return item;
	}

	@Override
	public Cart getCartByChecked(Integer userid) {
		carts = getCart(userid);
		Cart newCart = new Cart(); //new 一个新的cart,用来存储被选中商品项
		newCart.setUserid(userid); //设置用户id
		List<CartItem> items = carts.getItems();
		for (CartItem cartItem : items) {
			if(cartItem.getFlag()==1){
				newCart.addItem(cartItem);
			}
		}
		return newCart;
	}

	@Override
	public CartItem getCartItem(Integer userid, String goodsids) {
		jedis = RedisUtils.getPool().getResource();//从jedis池中得到jdeis对象
		String itemid = "" + userid + ":" + goodsids;
		mapper.enable(SerializationConfig.Feature.AUTO_DETECT_GETTERS);// 没出现多余的空行
		try {
			if (jedis.get(itemid)!=null) {
				item = mapper.readValue(jedis.get(itemid),CartItem.class);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return item;
	}

}
